package com.ruoyi.framework.security.handle;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

public class MigratingPasswordEncoder implements PasswordEncoder {

    private final PasswordEncoder modernEncoder = new BCryptPasswordEncoder();
    private final PasswordEncoder legacyMd5Encoder = new LegacyMd5PasswordEncoder();

    @Override
    public String encode(CharSequence rawPassword) {
        // 新用户注册或修改密码时，使用现代加密（BCrypt）
        return modernEncoder.encode(rawPassword);
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        // 检查存储的密码是否是 BCrypt 格式（以 $2a$, $2b$, $2y$ 开头）
        if (encodedPassword.startsWith("$2a$") ||
                encodedPassword.startsWith("$2b$") ||
                encodedPassword.startsWith("$2y$")) {
            // 使用 BCrypt 验证
            return modernEncoder.matches(rawPassword, encodedPassword);
        } else {
            // 否则，假设是旧的 MD5 格式（32位十六进制）
            return legacyMd5Encoder.matches(rawPassword, encodedPassword);
        }
    }

    // 用于判断是否需要更新密码（即当前是旧格式）
    public boolean needsUpgrade(String encodedPassword) {
        return !encodedPassword.startsWith("$2a$") &&
                !encodedPassword.startsWith("$2b$") &&
                !encodedPassword.startsWith("$2y$");
    }
}